package model;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;



public class SistemaMillennium implements ISistemaPrepago {
	private HashMap<String, Object> _tarjetas=new HashMap();
	private HashMap<String, Object> _estaciones=new HashMap();
	public SistemaMillennium()
	{	
		
	}

	public int cargarTarjeta(String idTarjeta, int saldoExtra, Date fecha) throws OperacionInvalidaException 
	{
		if(saldoExtra*100<500)
			System.out.println("la carga es insuficiente");
		else
		{
			Tarjeta t=(Tarjeta)_tarjetas.get(idTarjeta);
			if(t==null)
				System.out.println("tarjeta no valida");
			else
			{
				int saldo=t.mirarSaldo();
				if(saldo+saldoExtra*100>6000)
					System.out.println("no se puede cargar");
				else
				{
					t.cargar(saldoExtra);
					Operacion op=new Cargar(fecha,saldoExtra,t);
					t.añadirOp(op);
				}
			}
		}	
	    return 0;
	}

   public int consultarSaldo(String idTarjeta) throws OperacionInvalidaException 
	{
		Tarjeta t=(Tarjeta)_tarjetas.get(idTarjeta);
		int x=t.mirarSaldo();
	    return x;
   }        
        
	public Iterator consultarEstaciones() 
	{
	    Iterator it = _estaciones.entrySet().iterator();
	    return it;
	}

	
	public Iterator consultarTarjetas() 
	{
		Iterator it = _tarjetas.entrySet().iterator();
	    return it;
	}

	
	public void crearEstacion(String id, String zona, String nombre) throws OperacionInvalidaException 
	{			
		Estacion est=new Estacion(zona,nombre);
		_estaciones.put(id,est);
	    return;
	}

	
   public void crearTarjeta(String id, int saldoInicial, String nombre, String tipoTarjeta) throws OperacionInvalidaException 
	{	
		if(saldoInicial>60)
			System.out.println("demasiado saldo");
		else
		{
			saldoInicial=saldoInicial*100;
			if (tipoTarjeta.equals("social"))
			{
				Social tar=new Social(id,saldoInicial,nombre,tipoTarjeta);_tarjetas.put(id,tar);
			}
			else if (tipoTarjeta.equals("general"))
			{
				General tar=new General(id,saldoInicial,nombre,tipoTarjeta);_tarjetas.put(id,tar);
			}
			else if (tipoTarjeta.equals("universitaria"))
			{
				Universitaria tar=new Universitaria(id,saldoInicial,nombre,tipoTarjeta);_tarjetas.put(id,tar);
			}
			else System.out.println("el tipo de tarjeta no es correcto");
		}
		return;
	}

	public void eliminarEstacion(String id) throws OperacionInvalidaException 
	{
		if	(_estaciones.remove(id)==null)
			System.out.println("la estacion no existe");
	    return;
	}
	
	public void eliminarTarjeta(String id) throws OperacionInvalidaException 
	{
		if (_tarjetas.remove(id)==null)
			System.out.println("Esa tarjeta no existe");
	    return;
	}


	public int registrarEntrada(String idTarjeta, String idEstacion, Date fecha) throws OperacionInvalidaException 
	{
		Estacion est = (Estacion)_estaciones.get(idEstacion);
		Tarjeta t = (Tarjeta)_tarjetas.get(idTarjeta);
		if (t==null) 
			System.out.println(" Id de la tarjeta incorrecta"); 
		else
			if(est==null)
				System.out.println(" Estacion incorrecta");
			else
				if (t.mirarSaldo()<t.consultarImporte())
					System.out.println("No tiene saldo suficiente");
				else
				{
					t.subir();
					int importe=t.consultarImporte();
					Operacion op=new Subir(fecha,importe,t,est);
					t.añadirOp(op);
				}
		   return 0;
	}
	
	public int  registrarSalida(String idTarjeta, String idEstacion, Date fecha) throws OperacionInvalidaException 
	{	
		Tarjeta t = (Tarjeta)_tarjetas.get(idTarjeta);
		Estacion est = (Estacion)_estaciones.get(idEstacion);
		if (t==null) 
			System.out.println(" Id de la tarjeta incorrecta"); 
		else
			if(est==null)
				System.out.println(" Estacion incorrecta");
			else
			{
				Operacion op=new Bajar(fecha,t,est);
				t.añadirOp(op);
			}
	    return 0;
	}

	public Iterator consultarOperaciones(String idTarjeta, Date fechaInicial, Date fechaFinal) throws OperacionInvalidaException 
	{
		Tarjeta t = (Tarjeta)_tarjetas.get(idTarjeta);
		if (t==null) 
			System.out.println(" Id de la tarjeta incorrecta"); 
		Iterator<Operacion> iterador=t.consultarFechas(fechaInicial,fechaFinal);
	    return iterador;
	}
	
	
	public void transferirSaldo(String idTarjetaOrdenante,
		String idTarjetaReceptora, int importe, Date fecha) throws OperacionInvalidaException 
	{
		Tarjeta tOrdenante = (Tarjeta)_tarjetas.get(idTarjetaOrdenante);
		Tarjeta tReceptora = (Tarjeta)_tarjetas.get(idTarjetaReceptora);
		if(tOrdenante==null || tReceptora==null)
			System.out.println("tarjeta no valida");
		else
			if(consultarSaldo(idTarjetaOrdenante)<importe)
				System.out.println("no tiene suficiente saldo");
			else
			{	
				tOrdenante.prestar(importe);
				tReceptora.cargar(importe);
				Operacion opOrdenante=new Transferir(fecha,importe,tOrdenante,"transferir a",tReceptora);
				Operacion opReceptora=new Transferir(fecha,importe,tReceptora,"recibir de",tOrdenante);
				tOrdenante.c.add(opOrdenante);
				tReceptora.c.add(opReceptora);
			}
	    return;
	}
        
        

}
